Java获取本地ip地址

获取本地ip地址本来是应该很简单的,但是在项目中本地实现了之后,放到生产环境却不行了,一直获取不到本地ip.

下面先粘出我在生产环境中没有获取到ip地址的一般简单的获取ip地址的流程,最后面是我的解决方法(代码):

public static String getLocalIpAddr() {
    Enumeration<NetworkInterface> networks = null;
    try {
        // 获取网卡设备
        networks = NetworkInterface.getNetworkInterfaces();
    } catch (SocketException e) {
        logger.info(e.getMessage());
    }
    InetAddress ip = null;
    Enumeration<InetAddress> addrs;
    // 遍历网卡设备
    while (networks.hasMoreElements()){
        addrs = networks.nextElement().getInetAddresses();
        while (addrs.hasMoreElements()){
            ip = addrs.nextElement();
            if (ip != null && ip instanceof InetAddress && ip.isSiteLocalAddress()){
                if (ip.getHostAddress()==null || "".equals(ip.getHostAddress())){
                    logger.info("获取到的客户端内网ip为空,从配置文件读取本地ip。");
                    return null;
                }
                return ip.getHostAddress();// 客户端ip
            }
        }
    }
    return null;
}

 

这样获取在生产环境中出现了ip地址获取不到的情况,因此修改成下面的非常规方法来获取了(皮一下,哈哈):

 

public static String getLocalIpAddr() {

    String clientIP = null;
    Enumeration<NetworkInterface> networks = null;
    try {
        //获取所有网卡设备
        networks = NetworkInterface.getNetworkInterfaces();
        if (networks == null) {
            //没有网卡设备 打印日志  返回null结束
            logger.info("networks  is null");
            return null;
        }
    } catch (SocketException e) {
        System.out.println(e.getMessage());
    }
    InetAddress ip;
    Enumeration<InetAddress> addrs;
    // 遍历网卡设备
    while (networks.hasMoreElements()) {
        NetworkInterface ni = networks.nextElement();
        try {
            //过滤掉 loopback设备、虚拟网卡
            if (!ni.isUp() || ni.isLoopback() || ni.isVirtual()) {
                continue;
            }
        } catch (SocketException e) {
            logger.info(e.getMessage());
        }
        addrs = ni.getInetAddresses();
        if (addrs == null) {
            logger.info("InetAddress is null");
            continue;
        }
        // 遍历InetAddress信息
        while (addrs.hasMoreElements()) {
            ip = addrs.nextElement();
            if (!ip.isLoopbackAddress() && ip.isSiteLocalAddress() && ip.getHostAddress().indexOf(":") == -1) {
                try {
                    clientIP = ip.toString().split("/")[1];
                } catch (ArrayIndexOutOfBoundsException e) {
                    clientIP = null;
                }
            }
        }
    }
    return clientIP;
}

 

因为打印InetAddress对象的时候会打印成  /xxx.xxx.xxx.xxx  这样的格式,所以直接就将这个字符串解析了,虽然比较粗暴,但是也是有效的。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值